package com.clinic.logic.drug;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.clinic.accessor.db.DrugBrandAccessor;
import com.clinic.entity.db.DrugBrand;
import com.clinic.entity.gui.GuiDrugBrand;
import com.clinic.entity.gui.GuiPagination;
import com.clinic.entity.param.Index;
import com.clinic.util.CommonUtil;
import com.clinic.util.ConvertUtil;

@Component
public class DrugBrandLogic {

	@Autowired
	DrugBrandAccessor drugBrandAccessor;

	public GuiDrugBrand insertDrugBrand(GuiDrugBrand guiDrugBrand){
		
		DrugBrand drugBrand = ConvertUtil.getDrugBrandByGuiDrugBrand(guiDrugBrand);
		DrugBrand result = drugBrandAccessor.insertOrUpdate(drugBrand);
		return ConvertUtil.getGuiDrugBrandByDrugBrand(result);
	}
	
	public GuiDrugBrand updateDrugBrand(GuiDrugBrand guiDrugBrand){
		DrugBrand drugBrand = drugBrandAccessor.getDrugBrandById(guiDrugBrand.getBrandId());
		drugBrand.setBrandId(guiDrugBrand.getBrandId());
		drugBrand.setName(guiDrugBrand.getName());
		DrugBrand result = drugBrandAccessor.insertOrUpdate(drugBrand);
		return ConvertUtil.getGuiDrugBrandByDrugBrand(result);
	}
	
	public GuiDrugBrand getRecordsById(long id){
		
		DrugBrand drugBrand = drugBrandAccessor.getDrugBrandById(id);
		return ConvertUtil.getGuiDrugBrandByDrugBrand(drugBrand);
	}
	
	public boolean isNotAvailableDrugBrand(GuiDrugBrand guiDrugBrand) {
		
		return !isAvailableDrugBrand(guiDrugBrand);
	}
	
	public boolean isAvailableDrugBrand(GuiDrugBrand guiDrugBrand) {
		
		String name = guiDrugBrand.getName();
		DrugBrand result = drugBrandAccessor.getDrugBrandByName(name);
		return (result != null);
	}
	
	public boolean isValidDrugBrandInsert(GuiDrugBrand guiDrugBrand) {
		String name = guiDrugBrand.getName();
		DrugBrand brand = drugBrandAccessor.getDrugBrandByName(name);
		return (brand == null);
	}
	
	@Transactional
	public boolean isValidDrugBrandUpdate(GuiDrugBrand guiDrugBrand) {
		long drugId = guiDrugBrand.getBrandId();
		DrugBrand oDrugBrand = drugBrandAccessor.getDrugBrandById(drugId);
		String nDrugBrandName = guiDrugBrand.getName();
		String oDrugBrandName = oDrugBrand.getName();
		DrugBrand uDrugBrand = drugBrandAccessor.getDrugBrandByName(nDrugBrandName);	

		return ((nDrugBrandName.equals(oDrugBrandName)) || (uDrugBrand == null));
	}
	
	public List<GuiDrugBrand> getDrugBrandListByTerm(String term, Index index) {
		List<DrugBrand> drugBrandList = drugBrandAccessor.getOrderedDrugBrandsByTerm(term, index);		
		return ConvertUtil.getGuiDrugBrandsByDrugBrands(drugBrandList);
	}
	
	public List<GuiDrugBrand> getDrugBrands(Index index) {
		List<DrugBrand> drugBrandList = drugBrandAccessor.getDrugBrands(index);
		List<GuiDrugBrand> result = new ArrayList<GuiDrugBrand>();
		for (DrugBrand drugBrand : drugBrandList) {
			GuiDrugBrand guiDrugBrand = ConvertUtil.getGuiDrugBrandByDrugBrand(drugBrand);
			if (guiDrugBrand.isAvailable()) {
				result.add(guiDrugBrand);
			}
		}
		return result;
	}
	
	@Transactional
	public List<GuiDrugBrand> getDrugBrandList(Index index) {
		List<DrugBrand> drugBrandList = drugBrandAccessor.getDrugBrands(index);
		return ConvertUtil.getGuiDrugBrandsByDrugBrands(drugBrandList);
	}
	
	
	public GuiPagination getPaginationOfDrugBrandsByTerm(String term, int page) {
		int total = drugBrandAccessor.countOfOrderedDrugBrandsByTerm(term);
		return CommonUtil.getPaginationInfo(page, total);
	}
	
	public GuiPagination getPaginationOfDrugBrands(int page) {
		int total = drugBrandAccessor.countOfDrugBrands();
		return CommonUtil.getPaginationInfo(page, total);
	}
}
